# Find Rects Example
# 这个例子展示了如何使用april标签代码中的四元检测代码在图像中找到矩形。 四元检测算法以非常稳健的方式检测矩形，并且比基于Hough变换的方法好得多。 例如，即使镜头失真导致这些矩形看起来弯曲，它仍然可以检测到矩形。 圆角矩形是没有问题的！
# (但是，这个代码也会检测小半径的圆)...



import sensor, image, time,math
green_threshold =(10, 89, -72, -30, -27, 127)
thresholds = (90, 100, -128, 127, -128, 127)#光线处理阈值
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.

sensor.reset()

sensor.set_pixformat(sensor.RGB565) # grayscale is faster (160x120 max on OpenMV-M7)

sensor.set_framesize(sensor.QQVGA)

sensor.skip_frames(time = 2000)

sensor.set_auto_whitebal(False) # turn this off.关闭白平衡

sensor.set_framesize(sensor.QVGA)

sensor.set_auto_gain(False) # must be turned off for color tracking

#sensor.snapshot().binary([thresholds], invert=False, zero=True)#光线去除

#sensor.set_pixformat(sensor.GRAYSCALE)#灰度
clock = time.clock()

import time
from pyb import UART

# Always pass UART 3 for the UART number for your OpenMV Cam.
# The second argument is the UART baud rate. For a more advanced UART control
# example see the BLE-Shield driver.
uart = UART(3, 19200)
#image.find_rects([roi=Auto, threshold=10000])
#使用用于查找AprilTAg的相同的quad detection算法来查找图像中的矩形。 最适用与背景形成鲜明对比的矩形。AprilTag的quad detection可以处理任意缩放/旋转/剪切的矩形。 返回一个 image.rect 对象的列表。
#roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定， ROI即图像矩形。操作范围仅限于 roi 区域内的像素。
#边界大小（通过在矩形边缘上的所有像素上滑动索贝尔算子并相加该值）小于 threshold 的矩形会从返回列表中过滤出来。 threshold 的正确值取决于您的应用程序/场景。
#不支持压缩图像和bayer图像。
#此方法在OpenMV Cam M4 上不可用。
# 下面的`threshold`应设置为足够高的值，以滤除在图像中检测到的具有
# 低边缘幅度的噪声矩形。最适用与背景形成鲜明对比的矩形。
#roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定， ROI 即图像矩形。操作范围仅限于roi区域内的像素。

K=3340    #常数
while(True):

    clock.tick()#开始追踪运行时间

    #img = sensor.snapshot().binary([green_threshold], invert=False, zero=True)#光线去除
    img = sensor.snapshot().lens_corr(1.8)#畸变矫正
    #mg.gaussian(size[,unsharp=False[,mul[,add=0[,threshold=False[,offset=0[,invert=False[,mask=None]]]]]]])
    img.gaussian(1)#模糊
    for blob in img.find_blobs([green_threshold], pixels_threshold=200, area_threshold=200, merge=True):
        # These values depend on the blob not being circular - otherwise they will be shaky.
        if blob.elongation() > 0.5:
            img.draw_edges(blob.min_corners(), color=(255,0,0))
            img.draw_line(blob.major_axis_line(), color=(0,255,0))
            img.draw_line(blob.minor_axis_line(), color=(0,0,255))
        # These values are stable all the time.
        img.draw_rectangle(blob.rect())
        img.draw_cross(blob.cx(), blob.cy())
    #blobs = img.find_blobs([green_threshold])
   # for r in img.find_rects(threshold = 8000):

        #img.draw_rectangle(r.rect(), color = (255, 0, 0))

        #for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 0, 255))
        #print(r)
        #area=(r[0],r[1],r[2],r[3])#area为识别到的矩形的区域
        #print ("area=",area)
        #statistics = img.get_statistics(roi=area)#像素颜色统计
        #print(statistics)
        #(4, 100, -111, 127, -108, -7)是蓝色的阈值，所以当区域内的众数（也就是最多的颜色），范围在这个阈值内，就说明是蓝色的矩形。
        #((13, 89, -59, -16, 8, 46)), generic_green_thresholds
        #(30, 100, 15, 127, 15, 127), generic_red_thresholds
        #l_mode()，a_mode()，b_mode()是L通道，A通道，B通道的众数。
        #if 13<statistics.l_mode()<89 and -59<statistics.a_mode()<-16 and 8<statistics.b_mode()<46:
        #           img.draw_rectangle(area, color = (0, 255, 0))#将绿的矩形用绿的矩形框出来
                   #print("角度：\nFPS %f" % clock.fps())
        #          x=((r[0]+r[2]/2),(r[1]-r[3]/2))
                   #statistics = img.get_statistics(x)#中心点统计
        Lm =(blob[2]+blob[3])/2
        length = K/Lm
        print("距离：")#单位cm
        print(length)
        #print(blob[4])#打印像素数量
        #print(Lm)  # K=Lm*距离
        uart.write("\nl %f" %length)
        uart.write("\nx  %f" %blob[5])
        uart.write("\ny  %f" %blob[6])
        time.sleep(1000)

       # else:
         #          img.draw_rectangle(area, color = (255, 255, 255))#识别到非绿色的矩形用白的矩形框出来




























